#!/bin/bash

###############################################################################
# 聚合码项目启动脚本 - Linux版本
# 功能：启动、停止、重启、查看状态
# 使用方法：
#   ./start.sh start   - 启动应用
#   ./start.sh stop    - 停止应用
#   ./start.sh restart - 重启应用
#   ./start.sh status  - 查看状态
###############################################################################

# 应用配置
APP_NAME="ruoyi-admin"
JAR_NAME="ruoyi-admin.jar"
JVM_OPTS="-Xms512m -Xmx2048m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m"
SPRING_PROFILE="prod"  # 生产环境配置

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 获取当前脚本目录
APP_HOME=$(cd "$(dirname "$0")" && pwd)
JAR_PATH="${APP_HOME}/${JAR_NAME}"
PID_FILE="${APP_HOME}/${APP_NAME}.pid"
LOG_FILE="${APP_HOME}/logs/application.log"

# 创建logs目录
mkdir -p "${APP_HOME}/logs"

###############################################################################
# 检查jar包是否存在
###############################################################################
check_jar() {
    if [ ! -f "${JAR_PATH}" ]; then
        echo -e "${RED}错误: 找不到jar包 ${JAR_NAME}${NC}"
        echo "请确保jar包与脚本在同一目录"
        exit 1
    fi
}

###############################################################################
# 获取进程ID
###############################################################################
get_pid() {
    if [ -f "${PID_FILE}" ]; then
        PID=$(cat "${PID_FILE}")
        if ps -p ${PID} > /dev/null 2>&1; then
            echo ${PID}
        else
            rm -f "${PID_FILE}"
            echo 0
        fi
    else
        echo 0
    fi
}

###############################################################################
# 启动应用
###############################################################################
start() {
    check_jar
    
    PID=$(get_pid)
    if [ ${PID} -ne 0 ]; then
        echo -e "${YELLOW}应用已在运行中, PID=${PID}${NC}"
        return 1
    fi
    
    echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    echo -e "${GREEN}🚀 正在启动 ${APP_NAME}...${NC}"
    echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    
    # 启动应用
    nohup java ${JVM_OPTS} \
        -Dspring.profiles.active=${SPRING_PROFILE} \
        -jar "${JAR_PATH}" \
        > "${LOG_FILE}" 2>&1 &
    
    # 保存PID
    echo $! > "${PID_FILE}"
    
    # 等待启动
    echo "等待应用启动..."
    sleep 3
    
    PID=$(get_pid)
    if [ ${PID} -ne 0 ]; then
        echo -e "${GREEN}✅ 应用启动成功!${NC}"
        echo -e "PID: ${PID}"
        echo -e "日志文件: ${LOG_FILE}"
        echo ""
        echo "查看实时日志: tail -f ${LOG_FILE}"
        echo "查看启动日志: cat ${LOG_FILE}"
    else
        echo -e "${RED}❌ 应用启动失败!${NC}"
        echo "请查看日志: cat ${LOG_FILE}"
        exit 1
    fi
}

###############################################################################
# 停止应用
###############################################################################
stop() {
    PID=$(get_pid)
    if [ ${PID} -eq 0 ]; then
        echo -e "${YELLOW}应用未运行${NC}"
        return 1
    fi
    
    echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    echo -e "${YELLOW}🛑 正在停止 ${APP_NAME}... (PID=${PID})${NC}"
    echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    
    # 发送TERM信号
    kill ${PID}
    
    # 等待进程结束
    count=0
    while [ ${count} -lt 30 ]; do
        if ! ps -p ${PID} > /dev/null 2>&1; then
            break
        fi
        sleep 1
        count=$((count + 1))
        echo -n "."
    done
    echo ""
    
    # 检查是否停止成功
    if ps -p ${PID} > /dev/null 2>&1; then
        echo -e "${RED}应用未能正常停止，强制终止...${NC}"
        kill -9 ${PID}
        sleep 2
    fi
    
    rm -f "${PID_FILE}"
    echo -e "${GREEN}✅ 应用已停止${NC}"
}

###############################################################################
# 重启应用
###############################################################################
restart() {
    echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    echo -e "${YELLOW}🔄 重启应用...${NC}"
    echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    
    stop
    sleep 2
    start
}

###############################################################################
# 查看状态
###############################################################################
status() {
    PID=$(get_pid)
    if [ ${PID} -ne 0 ]; then
        echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
        echo -e "${GREEN}✅ 应用运行中${NC}"
        echo -e "${GREEN}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
        echo "应用名称: ${APP_NAME}"
        echo "进程ID: ${PID}"
        echo "jar包路径: ${JAR_PATH}"
        echo "日志文件: ${LOG_FILE}"
        echo ""
        echo "内存使用情况:"
        ps -p ${PID} -o pid,ppid,%mem,%cpu,cmd
    else
        echo -e "${RED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
        echo -e "${RED}❌ 应用未运行${NC}"
        echo -e "${RED}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
    fi
}

###############################################################################
# 查看日志
###############################################################################
logs() {
    if [ ! -f "${LOG_FILE}" ]; then
        echo -e "${RED}日志文件不存在${NC}"
        exit 1
    fi
    
    tail -f "${LOG_FILE}"
}

###############################################################################
# 主函数
###############################################################################
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart)
        restart
        ;;
    status)
        status
        ;;
    logs)
        logs
        ;;
    *)
        echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
        echo -e "${GREEN}聚合码项目管理脚本${NC}"
        echo -e "${YELLOW}━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━${NC}"
        echo ""
        echo "使用方法: $0 {start|stop|restart|status|logs}"
        echo ""
        echo "命令说明:"
        echo "  start   - 启动应用"
        echo "  stop    - 停止应用"
        echo "  restart - 重启应用"
        echo "  status  - 查看运行状态"
        echo "  logs    - 实时查看日志"
        echo ""
        exit 1
        ;;
esac

exit 0

